Tailwind CSS ๋ฒ ๋ฆฌ์ธํธ ๊ทธ๋ฃน๊ณผ ์ค์ฒฉ ์์์ด ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ๋ ๊น๋ํ๊ณ ํจ์จ์ ์ธ CSS๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์. ๊ธฐ๋ณธ ๊ฐ๋ ๋ถํฐ ๊ณ ๊ธ ํ์ฉ๋ฒ๊น์ง ๋ค๋ฃจ์ด ํ๋ก์ ํธ ์คํ์ผ๋ง์ ์ต์ ํํ ์ ์๋๋ก ๋์ต๋๋ค.
Tailwind CSS ๋ฒ ๋ฆฌ์ธํธ ๊ทธ๋ฃน ๋ง์คํฐํ๊ธฐ: ๊ฐ์ํ๋ ์คํ์ผ๋ง์ ์ํ ์ค์ฒฉ ์์์ด ๊ตฌ๋ฌธ ํ์ฉ
Tailwind CSS๋ ์น ๊ฐ๋ฐ์์ ์คํ์ผ๋ง์ ์ ๊ทผํ๋ ๋ฐฉ์์ ํ์ ํ์ต๋๋ค. ์ ํธ๋ฆฌํฐ ์ฐ์ ์ ๊ทผ ๋ฐฉ์์ ๊ฐ๋ฐ์๋ค์ด ๋นํ ๋ฐ ์๋ ์ ์ฐ์ฑ์ผ๋ก ๋น ๋ฅด๊ฒ ํ๋กํ ํ์ ์ ๋ง๋ค๊ณ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ถํ ์ ์๊ฒ ํด์ค๋๋ค. ๋ง์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ ์ค์์๋, ๋ฒ ๋ฆฌ์ธํธ ๊ทธ๋ฃน(variant groups)๊ณผ ์ค์ฒฉ ์์์ด ๊ตฌ๋ฌธ(nested modifier syntax)์ ์ฝ๋ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์๋ ๋๊ตฌ๋ก ๋๋ณด์ ๋๋ค. ์ด ์ข ํฉ ๊ฐ์ด๋๋ ๋ฒ ๋ฆฌ์ธํธ ๊ทธ๋ฃน๊ณผ ์ค์ฒฉ ์์์ด์ ๋ณต์กํ ๋ด์ฉ์ ๊น์ด ํ๊ณ ๋ค์ด, ์ด๊ฒ๋ค์ด ์ด๋ป๊ฒ ์คํ์ผ๋ง ์์ ํ๋ฆ์ ๊ฐ์ํํ๊ณ ํ๋ก์ ํธ์ ์ ๋ฐ์ ์ธ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ ํ ์ ์๋์ง ๋ณด์ฌ์ค ๊ฒ์ ๋๋ค.
Tailwind CSS ๋ฒ ๋ฆฌ์ธํธ ๊ทธ๋ฃน์ด๋ ๋ฌด์์ธ๊ฐ?
Tailwind CSS์ ๋ฒ ๋ฆฌ์ธํธ ๊ทธ๋ฃน์ ๋จ์ผ ์์์ ์ฌ๋ฌ ์์์ด๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๊ฐ ์ ํธ๋ฆฌํฐ ํด๋์ค์ ๋ํด ๋์ผํ ๊ธฐ๋ณธ ์์์ด๋ฅผ ๋ฐ๋ณตํ๋ ๋์ , ์ด๋ฅผ ๊ทธ๋ฃนํํ์ฌ ๋ ๊น๋ํ๊ณ ๊ฐ๋ ์ฑ ๋์ ์ฝ๋๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์ด ๊ธฐ๋ฅ์ ํ๋ฉด ํฌ๊ธฐ์ ๋ฐ๋ผ ๋ค๋ฅธ ์คํ์ผ์ ์ ์ฉํด์ผ ํ๋ ๋ฐ์ํ ๋์์ธ์ ํนํ ์ ์ฉํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ๋ค์ ์ฝ๋ ์ค๋ํซ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
<button class="md:px-4 md:py-2 md:bg-blue-500 md:hover:bg-blue-700 lg:px-6 lg:py-3 lg:bg-green-500 lg:hover:bg-green-700">
Click Me
</button>
์ด ์ฝ๋๋ ๋ฐ๋ณต์ ์ด๊ณ ์ฝ๊ธฐ ์ด๋ ต์ต๋๋ค. ๋ฒ ๋ฆฌ์ธํธ ๊ทธ๋ฃน์ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋จ์ํํ ์ ์์ต๋๋ค:
<button class="md:(px-4 py-2 bg-blue-500 hover:bg-blue-700) lg:(px-6 py-3 bg-green-500 hover:bg-green-700)">
Click Me
</button>
๋ ๋ฒ์งธ ์์ ๋ ํจ์ฌ ๋ ๊ฐ๊ฒฐํ๊ณ ์ดํดํ๊ธฐ ์ฝ์ต๋๋ค. `md:(...)`์ `lg:(...)` ๊ตฌ๋ฌธ์ ์์์ด๋ค์ ํจ๊ป ๊ทธ๋ฃนํํ์ฌ ์ฝ๋๋ฅผ ๋ ์ฝ๊ธฐ ์ฝ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ข๊ฒ ๋ง๋ญ๋๋ค.
์ค์ฒฉ ์์์ด ๊ตฌ๋ฌธ ์ดํดํ๊ธฐ
์ค์ฒฉ ์์์ด ๊ตฌ๋ฌธ์ ์์์ด๋ฅผ ๋ค๋ฅธ ์์์ด ์์ ์ค์ฒฉํ ์ ์๊ฒ ํจ์ผ๋ก์จ ๋ฒ ๋ฆฌ์ธํธ ๊ทธ๋ฃน์ ๊ฐ๋ ์ ํ ๋จ๊ณ ๋ ๋ฐ์ ์ํต๋๋ค. ์ด๋ ํนํ ๋ค๋ฅธ ํ๋ฉด ํฌ๊ธฐ ๋ด์์ ํฌ์ปค์ค, ํธ๋ฒ, ํ์ฑ ์ํ์ ๊ฐ์ ๋ณต์กํ ์ํธ์์ฉ ๋ฐ ์ํ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
ํธ๋ฒ ์ ๋ฒํผ ์คํ์ผ์ ๋ค๋ฅด๊ฒ ์ง์ ํ๊ณ ์ถ์ง๋ง, ๊ทธ ํธ๋ฒ ์คํ์ผ์ด ํ๋ฉด ํฌ๊ธฐ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๊ธฐ๋ฅผ ์ํ๋ค๊ณ ์์ํด๋ณด์ธ์. ์ค์ฒฉ ์์์ด๊ฐ ์๋ค๋ฉด ๊ธด ํด๋์ค ๋ชฉ๋ก์ด ํ์ํ ๊ฒ์ ๋๋ค. ์ด๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋ฉด ํฌ๊ธฐ ์์์ด ๋ด์ ํธ๋ฒ ์ํ๋ฅผ ์ค์ฒฉํ ์ ์์ต๋๋ค:
<button class="md:(hover:bg-blue-700 focus:outline-none focus:ring-2) lg:(hover:bg-green-700 focus:outline-none focus:ring-4)">
Click Me
</button>
์ด ์์ ์์ `hover:bg-blue-700`๊ณผ `focus:outline-none focus:ring-2` ์คํ์ผ์ ๋ฒํผ์ด ํธ๋ฒ๋๊ฑฐ๋ ํฌ์ปค์ค๋ ๋ ์ค๊ฐ ํฌ๊ธฐ ํ๋ฉด ์ด์์์๋ง ์ ์ฉ๋ฉ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก, `hover:bg-green-700`๊ณผ `focus:outline-none focus:ring-4` ์คํ์ผ์ ํฐ ํ๋ฉด ์ด์์์ ๋ฒํผ์ด ํธ๋ฒ๋๊ฑฐ๋ ํฌ์ปค์ค๋ ๋ ์ ์ฉ๋ฉ๋๋ค. ์ด๋ฌํ ์ค์ฒฉ์ ๋ช ํํ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๋ง๋ค๊ณ ์ ์ฉ๋๋ ์คํ์ผ์ ๋ํด ์ถ๋ก ํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
๋ฒ ๋ฆฌ์ธํธ ๊ทธ๋ฃน๊ณผ ์ค์ฒฉ ์์์ด ์ฌ์ฉ์ ์ด์
- ๊ฐ๋ ์ฑ ํฅ์: ๋ฒ ๋ฆฌ์ธํธ ๊ทธ๋ฃน๊ณผ ์ค์ฒฉ ์์์ด๋ ๋ฐ๋ณต์ ์ค์ด๊ณ ๋ช ํํ ์๊ฐ์ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ด ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ์ฝ๊ณ ์ดํดํ ์ ์๊ฒ ํฉ๋๋ค.
- ์ ์ง๋ณด์์ฑ ๊ฐํ: ๊ด๋ จ๋ ์คํ์ผ์ ํจ๊ป ๊ทธ๋ฃนํํจ์ผ๋ก์จ ๊ธด ํด๋์ค ๋ชฉ๋ก์ ๊ฒ์ํ ํ์ ์์ด ์ฝ๊ฒ ์์ ํ๊ณ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค.
- ์ฝ๋ ์ค๋ณต ๊ฐ์: ๋ฒ ๋ฆฌ์ธํธ ๊ทธ๋ฃน์ ๋์ผํ ๊ธฐ๋ณธ ์์์ด๋ฅผ ์ฌ๋ฌ ๋ฒ ๋ฐ๋ณตํ ํ์๋ฅผ ์์ ์ฝ๋๋ฅผ ์ค์ด๊ณ ํจ์จ์ฑ์ ํฅ์์ํต๋๋ค.
- ๋ฐ์ํ ๋์์ธ ๋จ์ํ: ์ค์ฒฉ ์์์ด๋ ํ๋ฉด ํฌ๊ธฐ์ ๋ฐ๋ผ ๋ค๋ฅธ ์์์ด๋ฅผ ๊ฐ๊ฒฐํ๊ณ ์ฒด๊ณ์ ์ผ๋ก ์ ์ฉํ ์ ์๊ฒ ํ์ฌ ๋ฐ์ํ ์คํ์ผ์ ๋ ์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์๊ฒ ํฉ๋๋ค.
- ์์ฐ์ฑ ์ฆ๋: ์คํ์ผ๋ง ์์ ํ๋ฆ์ ๊ฐ์ํํจ์ผ๋ก์จ ๋ฒ ๋ฆฌ์ธํธ ๊ทธ๋ฃน๊ณผ ์ค์ฒฉ ์์์ด๋ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๋ ๋น ๋ฅด๊ณ ํจ์จ์ ์ผ๋ก ๊ตฌ์ถํ๋ ๋ฐ ๋์์ ์ค ์ ์์ต๋๋ค.
์ค์ฉ์ ์ธ ์์ ๋ฐ ์ฌ์ฉ ์ฌ๋ก
ํ๋ก์ ํธ์์ ๋ฒ ๋ฆฌ์ธํธ ๊ทธ๋ฃน๊ณผ ์ค์ฒฉ ์์์ด๋ฅผ ์ฌ์ฉํ ์ ์๋ ๋ช ๊ฐ์ง ์ค์ฉ์ ์ธ ์์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์์ 1: ๋ด๋น๊ฒ์ด์ ๋ฉ๋ด ์คํ์ผ๋ง
๋ชจ๋ฐ์ผ๊ณผ ๋ฐ์คํฌํฑ ํ๋ฉด์ ๋ํด ๋ค๋ฅธ ์คํ์ผ์ ๊ฐ์ง ๋ด๋น๊ฒ์ด์ ๋ฉ๋ด๋ฅผ ๊ณ ๋ คํด ๋ณด์ธ์.
<ul class="flex flex-col md:flex-row md:space-x-4">
<li><a href="#" class="block py-2 px-4 text-gray-700 hover:bg-gray-100 md:(py-0 hover:bg-transparent)">Home</a></li>
<li><a href="#" class="block py-2 px-4 text-gray-700 hover:bg-gray-100 md:(py-0 hover:bg-transparent)">About</a></li>
<li><a href="#" class="block py-2 px-4 text-gray-700 hover:bg-gray-100 md:(py-0 hover:bg-transparent)">Services</a></li>
<li><a href="#" class="block py-2 px-4 text-gray-700 hover:bg-gray-100 md:(py-0 hover:bg-transparent)">Contact</a></li>
</ul>
์ด ์์ ์์ `md:(py-0 hover:bg-transparent)` ์์์ด ๊ทธ๋ฃน์ ๋ฐ์คํฌํฑ ํ๋ฉด์์๋ ํธ๋ฒ ์ ์์ง ํจ๋ฉ๊ณผ ๋ฐฐ๊ฒฝ์์ ์ ๊ฑฐํ์ง๋ง, ๋ชจ๋ฐ์ผ ํ๋ฉด์์๋ ๊ทธ๋๋ก ์ ์งํฉ๋๋ค.
์์ 2: ์นด๋ ์ปดํฌ๋ํธ ์คํ์ผ๋ง
ํธ๋ฒ ๋ฐ ํฌ์ปค์ค ์ํ์ ๋ํด ๋ค๋ฅธ ์คํ์ผ์ ๊ฐ์ง ์นด๋ ์ปดํฌ๋ํธ๋ฅผ ์คํ์ผ๋งํด ๋ณด๊ฒ ์ต๋๋ค.
<div class="bg-white rounded-lg shadow-md overflow-hidden hover:shadow-lg transition-shadow duration-300 focus:outline-none focus:ring-2 focus:ring-blue-500"
>
<img src="image.jpg" alt="" class="w-full h-48 object-cover" />
<div class="p-4">
<h3 class="text-lg font-semibold">Card Title</h3>
<p class="text-gray-600">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
</div>
</div>
๋ฒ ๋ฆฌ์ธํธ ๊ทธ๋ฃน๊ณผ ์ค์ฒฉ ์์์ด๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ฉด ํฌ๊ธฐ์ ๋ฐ๋ผ ๋ค๋ฅธ ํธ๋ฒ ๋ฐ ํฌ์ปค์ค ์คํ์ผ์ ์ ์ฉํ ์ ์์ต๋๋ค. ๋ ๋์๊ฐ, ๋ค๋ฅธ ํ ๋ง๋ ๊ตญ์ ํ ๊ด๋ จ ์คํ์ผ์ ๋์ ํ ์๋ ์์ต๋๋ค:
<div class="bg-white rounded-lg shadow-md overflow-hidden transition-shadow duration-300 md:(hover:shadow-lg focus:(outline-none ring-2 ring-blue-500)) dark:bg-gray-800 dark:text-white"
>
<img src="image.jpg" alt="" class="w-full h-48 object-cover" />
<div class="p-4">
<h3 class="text-lg font-semibold">Card Title</h3>
<p class="text-gray-600 dark:text-gray-400">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
</div>
</div>
์ฌ๊ธฐ์ `md:(hover:shadow-lg focus:(outline-none ring-2 ring-blue-500))`๋ ์ค๊ฐ ํฌ๊ธฐ ํ๋ฉด ์ด์์์๋ง ํธ๋ฒ ๋ฐ ํฌ์ปค์ค ํจ๊ณผ๋ฅผ ์ ์ฉํฉ๋๋ค. `dark:bg-gray-800 dark:text-white`๋ ์นด๋๊ฐ ๋คํฌ ํ ๋ง ์ค์ ์ ๋ง์ถฐ ์กฐ์ ๋๋๋ก ํฉ๋๋ค.
์์ 3: ํผ ์ ๋ ฅ ์ํ ์ฒ๋ฆฌ
๋ค์ํ ์ํ(ํฌ์ปค์ค, ์ค๋ฅ ๋ฑ)์ ๋ํ ์๊ฐ์ ํผ๋๋ฐฑ์ ์ ๊ณตํ๊ธฐ ์ํด ํผ ์ ๋ ฅ์ ์คํ์ผ๋งํ๋ ๊ฒ์ ๋ฒ ๋ฆฌ์ธํธ ๊ทธ๋ฃน์ผ๋ก ๋จ์ํํ ์ ์์ต๋๋ค. ๊ฐ๋จํ ์ ๋ ฅ ํ๋๋ฅผ ๊ณ ๋ คํด ๋ณด๊ฒ ์ต๋๋ค:
<input type="text" class="border rounded-md py-2 px-3 focus:outline-none focus:ring-2 focus:ring-blue-500" placeholder="Enter your name">
์ค๋ฅ ์ํ์ ๋ฐ์ํ ์คํ์ผ๋ง์ผ๋ก ์ด๋ฅผ ๊ฐ์ ํ ์ ์์ต๋๋ค:
<input type="text" class="border rounded-md py-2 px-3 focus:outline-none md:(focus:ring-2 focus:ring-blue-500) invalid:border-red-500 invalid:focus:ring-red-500" placeholder="Enter your name">
`md:(focus:ring-2 focus:ring-blue-500)`๋ ํฌ์ปค์ค ๋ง์ด ์ค๊ฐ ํฌ๊ธฐ ํ๋ฉด ์ด์์์๋ง ์ ์ฉ๋๋๋ก ๋ณด์ฅํฉ๋๋ค. `invalid:border-red-500 invalid:focus:ring-red-500`๋ ์ ๋ ฅ์ด ์ ํจํ์ง ์์ ๋ ์ ๋ ฅ์ ๋นจ๊ฐ์ ํ ๋๋ฆฌ์ ํฌ์ปค์ค ๋ง์ผ๋ก ์คํ์ผ๋งํฉ๋๋ค. Tailwind๋ ํ์ํ ๋ ์์ฌ ํด๋์ค(pseudo-classes)์ ์ ๋์ฌ ์ฒ๋ฆฌ๋ฅผ ์๋์ผ๋ก ์ํํ์ฌ ์ฌ๋ฌ ๋ธ๋ผ์ฐ์ ์์ ์ ๊ทผ์ฑ์ ํฅ์์ํจ๋ค๋ ์ ์ ์ ์ํ์ธ์.
๋ฒ ๋ฆฌ์ธํธ ๊ทธ๋ฃน๊ณผ ์ค์ฒฉ ์์์ด ์ฌ์ฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
- ๋จ์ํ๊ฒ ์ ์งํ๊ธฐ: ์ค์ฒฉ ์์์ด๋ ๊ฐ๋ ฅํ ์ ์์ง๋ง, ๊ณผ๋ํ๊ฒ ์ค์ฒฉํ๋ ๊ฒ์ ํผํ์ธ์. ์ฝ๋๋ฅผ ๊ฐ๋ฅํ ํ ๋จ์ํ๊ณ ์ฝ๊ธฐ ์ฝ๊ฒ ์ ์งํ์ธ์.
- ์๋ฏธ ์๋ ์ด๋ฆ ์ฌ์ฉํ๊ธฐ: ์ ํธ๋ฆฌํฐ ํด๋์ค์ ์ค๋ช ์ ์ธ ์ด๋ฆ์ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ์ดํดํ ์ ์๋๋ก ํ์ธ์.
- ์ผ๊ด์ฑ ์ ์งํ๊ธฐ: ํ๋ก์ ํธ ์ ๋ฐ์ ๊ฑธ์ณ ์ผ๊ด๋ ์คํ์ผ๋ง ์ ๊ทผ ๋ฐฉ์์ ์ ์งํ์ฌ ํต์ผ๋ ๋ชจ์๊ณผ ๋๋์ ๋ณด์ฅํ์ธ์.
- ์ฝ๋ ๋ฌธ์ํํ๊ธฐ: ๋ณต์กํ ์คํ์ผ๋ง ํจํด๊ณผ ๋ก์ง์ ์ค๋ช ํ๊ธฐ ์ํด ์ฝ๋์ ์ฃผ์์ ์ถ๊ฐํ์ธ์. ์ด๋ ํ์ผ๋ก ์์ ํ ๋ ํนํ ์ค์ํฉ๋๋ค.
- Tailwind ๊ตฌ์ฑ ํ์ฉํ๊ธฐ: Tailwind์ ๊ตฌ์ฑ ํ์ผ์ ์ฌ์ฉ์ ์ ์ํ์ฌ ์์ ๋ง์ ๋ง์ถค ์์์ด์ ํ ๋ง๋ฅผ ์ ์ํ์ธ์. ์ด๋ฅผ ํตํด ํน์ ํ๋ก์ ํธ ์๊ตฌ์ ๋ง๊ฒ Tailwind๋ฅผ ์กฐ์ ํ ์ ์์ต๋๋ค.
๊ณ ๊ธ ์ฌ์ฉ ์ฌ๋ก
`theme` ํจ์๋ก ๋ฒ ๋ฆฌ์ธํธ ์ฌ์ฉ์ ์ ์ํ๊ธฐ
Tailwind CSS๋ `theme` ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ ํธ๋ฆฌํฐ ํด๋์ค ๋ด์์ ์ง์ ํ ๋ง ๊ตฌ์ฑ์ ์ ๊ทผํ ์ ์๊ฒ ํด์ค๋๋ค. ์ด๋ ํ ๋ง ๋ณ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ ์คํ์ผ์ ๋ง๋๋ ๋ฐ ์ ์ฉํ ์ ์์ต๋๋ค.
<div class="text-[theme('colors.blue.500')] hover:text-[theme('colors.blue.700')]">
This is a blue text.
</div>
์ด๋ฅผ ๋ฒ ๋ฆฌ์ธํธ ๊ทธ๋ฃน๊ณผ ํจ๊ป ์ฌ์ฉํ์ฌ ๋ ๋ณต์กํ๊ณ ํ ๋ง๋ฅผ ์ธ์ํ๋ ์คํ์ผ๋ง์ ๋ง๋ค ์ ์์ต๋๋ค:
<div class="md:(text-[theme('colors.green.500')] hover:text-[theme('colors.green.700')])">
This is a green text on medium screens.
</div>
JavaScript์ ํตํฉํ๊ธฐ
Tailwind CSS๋ ์ฃผ๋ก CSS ์คํ์ผ๋ง์ ์ค์ ์ ๋์ง๋ง, JavaScript์ ํตํฉํ์ฌ ๋์ ์ด๊ณ ์ํธ์์ฉ์ ์ธ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์ฌ์ฉ์ ์ํธ์์ฉ์ด๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ๋ฐ๋ผ ํด๋์ค๋ฅผ ํ ๊ธํ๋ ๋ฐ JavaScript๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ์ฒดํฌ๋ฐ์ค์ ์ํ์ ๋ฐ๋ผ ํด๋์ค๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ๋ ๋ฐ JavaScript๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค:
<input type="checkbox" id="dark-mode">
<label for="dark-mode">Dark Mode</label>
<div class="bg-white text-gray-700 dark:bg-gray-800 dark:text-white">
<p>This is some content.</p>
</div>
<script>
const darkModeCheckbox = document.getElementById('dark-mode');
const content = document.querySelector('.bg-white');
darkModeCheckbox.addEventListener('change', () => {
content.classList.toggle('dark:bg-gray-800');
content.classList.toggle('dark:text-white');
});
</script>
์ด ์์ ์์ JavaScript ์ฝ๋๋ ๋คํฌ ๋ชจ๋ ์ฒดํฌ๋ฐ์ค๊ฐ ์ ํ๋๊ฑฐ๋ ํด์ ๋ ๋ ์ฝํ ์ธ ์์์ `dark:bg-gray-800` ๋ฐ `dark:text-white` ํด๋์ค๋ฅผ ํ ๊ธํฉ๋๋ค.
ํํ ํจ์ ๊ณผ ์ด๋ฅผ ํผํ๋ ๋ฐฉ๋ฒ
- ๊ณผ๋ํ ๊ตฌ์ฒด์ฑ: ์ฝ๋๋ฅผ ์ ์ง๋ณด์ํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ค ์ ์๋ ์ง๋์น๊ฒ ๊ตฌ์ฒด์ ์ธ ์ ํธ๋ฆฌํฐ ํด๋์ค ์ฌ์ฉ์ ํผํ์ธ์. ๋์ ๋ฒ ๋ฆฌ์ธํธ ๊ทธ๋ฃน์ ์ฌ์ฉํ์ฌ ํน์ ํ๋ฉด ํฌ๊ธฐ๋ ์ํ๋ฅผ ๋์์ผ๋ก ์ง์ ํ์ธ์.
- ์ผ๊ด์ฑ ์๋ ์คํ์ผ๋ง: ํ๋ก์ ํธ ์ ๋ฐ์ ๊ฑธ์ณ ์ผ๊ด๋ ์คํ์ผ๋ง ์ ๊ทผ ๋ฐฉ์์ ์ ์งํ์ฌ ํต์ผ๋ ๋ชจ์๊ณผ ๋๋์ ๋ณด์ฅํ์ธ์. Tailwind์ ๊ตฌ์ฑ ํ์ผ์ ์ฌ์ฉํ์ฌ ์์ ๋ง์ ๋ง์ถค ์คํ์ผ๊ณผ ํ ๋ง๋ฅผ ์ ์ํ์ธ์.
- ์ฑ๋ฅ ๋ฌธ์ : ๋๋ฌด ๋ง์ ์ ํธ๋ฆฌํฐ ํด๋์ค๋ ์ฑ๋ฅ์ ์ํฅ์ ์ค ์ ์์ผ๋ฏ๋ก ์ฌ์ฉ ์ค์ธ ์ ํธ๋ฆฌํฐ ํด๋์ค์ ์์ ์ ์ํ์ธ์. ๋ฒ ๋ฆฌ์ธํธ ๊ทธ๋ฃน์ ์ฌ์ฉํ์ฌ ํด๋์ค ์๋ฅผ ์ค์ด๊ณ ์ฝ๋๋ฅผ ์ต์ ํํ์ธ์.
- ์ ๊ทผ์ฑ ๋ฌด์: ์ฅ์ ๊ฐ ์๋ ์ฌ์ฉ์๋ฅผ ํฌํจํ ๋ชจ๋ ์ฌ์ฉ์๊ฐ ์คํ์ผ์ ์ ๊ทผํ ์ ์๋๋ก ๋ณด์ฅํ์ธ์. ARIA ์์ฑ๊ณผ ์๋งจํฑ HTML์ ์ฌ์ฉํ์ฌ ์ ๊ทผ์ฑ์ ํฅ์์ํค์ธ์.
๊ฒฐ๋ก
Tailwind CSS ๋ฒ ๋ฆฌ์ธํธ ๊ทธ๋ฃน๊ณผ ์ค์ฒฉ ์์์ด ๊ตฌ๋ฌธ์ ์คํ์ผ๋ง ์์ ํ๋ฆ์ ๊ฐ๋ ์ฑ, ์ ์ง๋ณด์์ฑ, ํจ์จ์ฑ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค. ์ด๋ฌํ ๊ธฐ๋ฅ์ ์ดํดํ๊ณ ํ์ฉํจ์ผ๋ก์จ ๋ ๊น๋ํ๊ณ ์ฒด๊ณ์ ์ธ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๋ ๋น ๋ฅด๊ณ ํจ๊ณผ์ ์ผ๋ก ๊ตฌ์ถํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ธฐ์ ์ ๋ฐ์๋ค์ฌ Tailwind CSS์ ๋ชจ๋ ์ ์ฌ๋ ฅ์ ๋ฐํํ๊ณ ์น ๊ฐ๋ฐ ํ๋ก์ ํธ๋ฅผ ํ ๋จ๊ณ ๋์ด์ฌ๋ฆฌ์ธ์. ์ฝ๋๋ฅผ ๋จ์ํ๊ณ , ์ผ๊ด์ฑ ์๊ณ , ์ ๊ทผ ๊ฐ๋ฅํ๊ฒ ์ ์งํ๊ณ , ํญ์ ๊ธฐ์ ๊ณผ ์ง์์ ํฅ์์ํค๊ธฐ ์ํด ๋ ธ๋ ฅํ๋ ๊ฒ์ ๊ธฐ์ตํ์ธ์.
์ด ๊ฐ์ด๋๋ Tailwind CSS์ ๋ฒ ๋ฆฌ์ธํธ ๊ทธ๋ฃน๊ณผ ์ค์ฒฉ ์์์ด์ ๋ํ ํฌ๊ด์ ์ธ ๊ฐ์๋ฅผ ์ ๊ณตํ์ต๋๋ค. ์ด ๊ฐ์ด๋์ ์ค๋ช ๋ ์์ ์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด ์ค๋๋ถํฐ ํ๋ก์ ํธ์์ ์ด๋ฌํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ธฐ ์์ํ๊ณ ๊ทธ ์ด์ ์ ์ง์ ๊ฒฝํํ ์ ์์ต๋๋ค. ์๋ จ๋ Tailwind CSS ์ฌ์ฉ์์ด๋ ์ด์ ๋ง ์์ํ๋ ์ฌ๋์ด๋ , ๋ฒ ๋ฆฌ์ธํธ ๊ทธ๋ฃน๊ณผ ์ค์ฒฉ ์์์ด๋ฅผ ๋ง์คํฐํ๋ ๊ฒ์ ์์ฌํ ์ฌ์ง ์์ด ์คํ์ผ๋ง ๋ฅ๋ ฅ์ ํฅ์์ํค๊ณ ๋ ๋์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
์น ๊ฐ๋ฐ ํ๊ฒฝ์ด ๊ณ์ํด์ ๋ฐ์ ํจ์ ๋ฐ๋ผ, ์ต์ ๋๊ตฌ์ ๊ธฐ์ ์ ์ต์ ์ํ๋ก ์ ์งํ๋ ๊ฒ์ด ์ฑ๊ณต์ ํ์์ ์ ๋๋ค. Tailwind CSS๋ ํ๋์ ์ด๊ณ ๋ฐ์ํ์ด๋ฉฐ ์ ๊ทผ ๊ฐ๋ฅํ ์น์ฌ์ดํธ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ๋์์ด ๋ ์ ์๋ ์ ์ฐํ๊ณ ๊ฐ๋ ฅํ ์คํ์ผ๋ง ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํฉ๋๋ค. ๋ฒ ๋ฆฌ์ธํธ ๊ทธ๋ฃน๊ณผ ์ค์ฒฉ ์์์ด๋ฅผ ๋ฐ์๋ค์์ผ๋ก์จ Tailwind CSS์ ๋ชจ๋ ์ ์ฌ๋ ฅ์ ๋ฐํํ๊ณ ์น ๊ฐ๋ฐ ๊ธฐ์ ์ ํ ๋จ๊ณ ๋์ด์ฌ๋ฆด ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ธฐ๋ฅ์ ์คํํ๊ณ , ๋ค์ํ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ํ์ํ๋ฉฐ, ์ปค๋ฎค๋ํฐ์ ๊ฒฝํ์ ๊ณต์ ํ์ธ์. ํจ๊ป ์ฐ๋ฆฌ๋ ์น ๊ฐ๋ฐ ์ธ๊ณ์์ ๊ณ์ํด์ ๊ฐ์ ํ๊ณ ํ์ ํ ์ ์์ต๋๋ค.
์ถ๊ฐ ์๋ฃ
- Tailwind CSS ๋ฐ์ํ ๋์์ธ ๋ฌธ์
- Tailwind CSS ํธ๋ฒ, ํฌ์ปค์ค ๋ฐ ๊ธฐํ ์ํ ๋ฌธ์
- Tailwind CSS ๊ตฌ์ฑ ๋ฌธ์
- YouTube ์ฑ๋ (Tailwind CSS ํํ ๋ฆฌ์ผ ๊ฒ์)
- Dev.to (Tailwind CSS ๊ธฐ์ฌ ๋ฐ ํ ๋ก ๊ฒ์)
์ฆ๊ฑฐ์ด ์ฝ๋ฉ ๋์ธ์!